## 自定义函数
"""
def 函数名(参数,参数):
    函数体
    return 返回值
"""

'''
def func(data):
    """将传入的参数分割为一个列表，使用逗号作为分割符"""
    return data.split(",")

if __name__ == "__main__": # 如果是直接执行该文件则执行下列内容，调用该文件的情况下不执行
    ## 函数调用
    data = func("nginx,tomcat,jboss,redis")
    print(data)
    print(func.__doc__) # 打印函数的注释部分
'''

## 函数参数注解
'''
def func2(n1: int,n2: int,n3: int)-> int: #这里仅仅是注释，也就是帮助，不会进行任何的参数检查
    if isinstance(n1, int) and isinstance(n2, int) and isinstance(n3, int):
        print(sum([n1,n2,n3]))
    else:
        # 如果参数错误，主动抛出异常
        raise TypeError("参数输入的类型错误")
'''

## 函数的参数类别
# 在实参和形参中，一一对应传递的参数叫做位置参数或普通参数
# 形参 形式参数，带有=的参数叫做默认参数，可以在调用时不传递该参数，但是必须写在参数的后面
# 实参 实际参数，带有=的参数叫做关键字参数，可以在调用时无需按照指定的顺序传递
def func3(data1, data2, data3="nihao"): # data 是占位使用，形式参数
    print(data1, data2, data3)

func3(data3="hello", data1="world", data2="abc") # hello 传入的数据，实际参数

## 参数补充
# 动态参数或万能参数

def func4(port, *args,ip="127,0.0.1", **kwargs): # * 接受所有的位置参数并封装成一个元组，**接受所有的关键字参数并封装成一个字典
    print('============================')
    print(port)
    print(args)
    print(ip)
    print(kwargs)
    print('============================')

func4(1,2,3,4,name="小明",ip="192.168.1.1",age=18)


